from django.shortcuts import render

# Create your views here.
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.generics import RetrieveAPIView, UpdateAPIView, CreateAPIView, ListAPIView, DestroyAPIView
from users.models import User, Address
# from rest_framework.generics import CreateAPIView

#功能描述：获取用户名
from users.serializers import RegisterCreateUserSerializer, UserCenterINfoSerializer, UserUpdateEmailSrializer, \
    AddressSerialize
from users.utils import check_active_token

"""
当光标离开选框时，前端携带 用户名 发送ajax请求到后端，
一、
获取参数
校验参数，即用户是否已注册
返回响应
请求方式： GET /users/usernames/(?P<username>\w{5,20})/count/
二、
视图类的继承
APIVIew
GenericAPIView              配合Mixin使用时 相比APIView有优势，
ListAPIView,CreateAPIView   有模型类时优先使用

username在url匹配时已经校验，无需使用序列化器校验
"""

class RegisterUsername(APIView):

    def get(self,request,username):
        # 获取参数
        # 校验参数，即用户是否已注册
            #前段根据count返回值判断用户名是否注册
        count = User.objects.filter(username=username).count()
        # 返回响应
        context = {
            'count':count,
            'username':username
        }
        return Response(context)

#功能描述：手机号码验证
"""
请求方式： GET /users/phones/(?P<mobile>1[345789]\d{9})/count/
代码逻辑：
1、获取参数
2、校验参数
3、返回响应
"""
class RegisterPhoneCountAPIView(APIView):
    def get(self,request,mobile):
        # 1、获取参数
        # 2、校验参数
        count = User.objects.filter(mobile=mobile).count()
        # 3、返回响应
        context = {
            'count':count,
            'phone':mobile
        }
        return Response(context)


# 功能描述：用户注册
"""
用户点击注册按钮时：将6个参数传递给后端，
请求方式:  POST
"""


# class RegisterCreateUserView(GenericAPIView):
class RegisterCreateUserView(APIView):
    def post(self,request):
        """
        接受参数
        校验参数
        数据入库
        返回响应（mixin业务）
        :return:
        """
        # 接受参数
        data = request.data
        # 校验参数
        serializer = RegisterCreateUserSerializer(data=data)
        serializer.is_valid(raise_exception=True)
        # 数据入库
        serializer.save()
        # 返回响应
        return Response(serializer.data)


# 第一种方法获取用户信息
# class UserCenterINfoVIew(APIView):
    """
    此接口只能是登录用户访问(权限设置)
    获取用户信息
    校验用户信息
    返回数据
    """
    # 此接口只能是登录用户访问(权限设置)
    # permission_classes = [IsAuthenticated]
    #
    # def get(self,request):
    #     # 获取用户信息
    #     # user = User.objects.get(id=id)   前端需要传递id,改url
    #     user = request.user
    #     # 校验用户信息,即创建序列化器
    #     serializer = UserCenterINfoSerializer(user)
    #     # 返回数据
    #     return Response(serializer.data)



# from rest_framework.generics import RetrieveAPIView, UpdateAPIView, CreateAPIView, ListAPIView, DestroyAPIView

#第二中方法获取用户信息
class UserCenterINfoVIew(RetrieveAPIView):

    serializer_class = UserCenterINfoSerializer
    permission_classes = [IsAuthenticated]

    #get_object()需要根据pk查找对象,无pk,就重写
    def get_object(self):
        return self.request.user


#功能描述:保存用户邮箱信息
class UserUpdateEmailView(UpdateAPIView):
    """
    获取用户邮箱
    检验邮箱格式
    更新用户邮箱状态
    发送邮箱文件
    保存用户激活状态
    """
    #
    # def put(self, request):
    #     # 1.接收数据
    #     data = request.data
    #     user = request.user
    #     # 2.对数据进行校验
    #     serializer = UserUpdateEmailSrializer(instance=user,data=data)
    #     serializer.is_valid(raise_exception=True)
    #     # 3.更新数据
    #     serializer.save()
    #     # 4.发送激活邮件
    #
    #      三级视图在哪里发送邮件
    #     # 5.返回响应
    #     return Response(serializer.data)

    # queryset = User.objects.all()
    serializer_class = UserUpdateEmailSrializer

    def get_object(self):
        return self.request.user


#功能描述:用户点击链接地址激活邮箱状态
class UserEmailActiveView(APIView):
    """
    用户点击激活按钮,跳转到前端成功激活页面,获取到加密token,
    将token发送到后端
    获取token,
    解密token
    根据id获取用户
    更改用户邮箱状态
    返回数据
    """""
    def get(self,request):
        # 获取token,
        token = request.query_params.get('token')
        if token is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        # 解密token
        # user_id = check_active_token(token)

        result = check_active_token(token)
        id = result.get('id')
        email = result.get('email')
        # 根据id获取用户
        if id is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        try:
            user = User.objects.get(id=id,email=email)
        except User.DoesNotExist:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        # 更改用户邮箱状态
        user.email_active=True
        user.save()
        # 返回数据
        return Response({"msg":'ok'})

    # def get(self, request):
    #     # 获取token, 并判断
    #     token = request.query_params.get('token')
    #     if not token:
    #         return Response({'message': '缺少token'}, status=status.HTTP_400_BAD_REQUEST)
    #     # 获取token中的id,email
    #     # 查询用户, 并判断是否存在
    #     user = User.check_verify_email_token(token)
    #     if user is None:
    #         return Response({'message': '链接无效'}, status=status.HTTP_400_BAD_REQUEST)
    #     else:
    #         # 修改状态
    #         user.email_active = True
    #         user.save()
    #         # 返回响应
    #         return Response({'message': 'ok'})


#显示地址列表
#新增用户收货地址
# from rest_framework.generics import CreateAPIView
class AddressView(CreateAPIView,ListAPIView):
    """
    用户点击保存之后,将地址信息通过ajax 请求发送至后端,
    接收数据
    校验数据
    保存数据
    返回响应
    """
    queryset = Address.objects.filter(is_deleted=True)
    serializer_class = AddressSerialize
    permission_classes = [IsAuthenticated]

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()
        serializer = self.get_serializer(queryset, many=True)
        user = self.request.user
        return Response({
            'user_id': user.id,
            'default_address_id': user.default_address_id,
            'limit': 20,
            'addresses': serializer.data,
        })

#删除地址
class DelAddressView(APIView):
    """
    接受数据
    校验参数
    跟新数据库
    返回响应
    """

    def delete(self,request,pk):
        address = Address.objects.get(id=pk)#get用于查询单个结果,filter用于查询多个结果
        address.is_deleted = True
        address.save()
        return Response(status=status.HTTP_204_NO_CONTENT)

#修改地址





